{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.3 模型评估方法 - ROC曲线与KS曲线"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.案例实战 - 股票客户流失预警模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1]\n",
      "0.7977288857345636\n",
      "[[0.82041491 0.17958509]\n",
      " [0.84029613 0.15970387]\n",
      " [0.79819342 0.20180658]\n",
      " [0.62989192 0.37010808]\n",
      " [0.61636611 0.38363389]]\n"
     ]
    }
   ],
   "source": [
    "# 1.读取数据\n",
    "import pandas as pd\n",
    "df = pd.read_excel('股票客户流失.xlsx')\n",
    "\n",
    "# 2.划分特征变量和目标变量\n",
    "X = df.drop(columns='是否流失') \n",
    "y = df['是否流失']\n",
    "\n",
    "# 3.划分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)\n",
    "\n",
    "# 4.模型搭建\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "model = LogisticRegression()\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# 5.模型使用1 - 预测数据结果\n",
    "y_pred = model.predict(X_test)\n",
    "print(y_pred[0:100])  # 打印预测内容的前100个看看\n",
    "\n",
    "# 查看全部的预测准确度\n",
    "from sklearn.metrics import accuracy_score\n",
    "score = accuracy_score(y_pred, y_test)\n",
    "print(score)  # 打印整体的预测准确度\n",
    "\n",
    "# 6.模型使用2 - 预测概率\n",
    "y_pred_proba = model.predict_proba(X_test)  \n",
    "print(y_pred_proba[0:5])  # 打印前5个客户的分类概率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.3 模型评估方法 - ROC曲线与KS曲线"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**4.3.1 分类模型的评估方法 - ROC曲线**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "补充知识点：混淆矩阵的Python实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[968  93]\n",
      " [192 156]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "m = confusion_matrix(y_test, y_pred)  # 传入预测值和真实值\n",
    "print(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0（预测不流失）</th>\n",
       "      <th>1（预测流失）</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0（实际不流失）</th>\n",
       "      <td>968</td>\n",
       "      <td>93</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1（实际流失）</th>\n",
       "      <td>192</td>\n",
       "      <td>156</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0（预测不流失）  1（预测流失）\n",
       "0（实际不流失）       968       93\n",
       "1（实际流失）        192      156"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = pd.DataFrame(m, index=['0（实际不流失）', '1（实际流失）'], columns=['0（预测不流失）', '1（预测流失）'])\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.83      0.91      0.87      1061\n",
      "           1       0.63      0.45      0.52       348\n",
      "\n",
      "    accuracy                           0.80      1409\n",
      "   macro avg       0.73      0.68      0.70      1409\n",
      "weighted avg       0.78      0.80      0.79      1409\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report # 计算命中率 无需手动计算\n",
    "print(classification_report(y_test, y_pred))  # 传入预测值和真实值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**4.3.2 案例实战 - 评估股票客户流失预警模型**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.17958509, 0.15970387, 0.20180658, ..., 0.04220544, 0.09782449,\n",
       "       0.63586739])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred_proba[:,1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1.计算ROC曲线需要的假警报率（fpr）、命中率（tpr）及阈值（thres）\n",
    "from sklearn.metrics import roc_curve\n",
    "fpr, tpr, thres = roc_curve(y_test, y_pred_proba[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(array([0.        , 0.        , 0.        , 0.00188501, 0.00188501,\n",
      "       0.00282752, 0.00282752, 0.00377003, 0.00377003, 0.00565504,\n",
      "       0.00565504, 0.00659755, 0.00659755, 0.00754006, 0.00754006,\n",
      "       0.00848256, 0.00848256, 0.01036758, 0.01036758, 0.01131008,\n",
      "       0.01131008, 0.01225259, 0.01225259, 0.0131951 , 0.0131951 ,\n",
      "       0.01508011, 0.01508011, 0.01602262, 0.01602262, 0.01696513,\n",
      "       0.01696513, 0.01885014, 0.01885014, 0.02073516, 0.02073516,\n",
      "       0.02356268, 0.02356268, 0.0273327 , 0.0273327 , 0.02827521,\n",
      "       0.02827521, 0.02921772, 0.02921772, 0.03016023, 0.03016023,\n",
      "       0.03110273, 0.03110273, 0.03204524, 0.03204524, 0.03298775,\n",
      "       0.03298775, 0.03393025, 0.03393025, 0.03487276, 0.03487276,\n",
      "       0.03581527, 0.03581527, 0.03675778, 0.03675778, 0.03770028,\n",
      "       0.03770028, 0.03864279, 0.03864279, 0.0395853 , 0.0395853 ,\n",
      "       0.04241282, 0.04241282, 0.04335533, 0.04335533, 0.04429783,\n",
      "       0.04429783, 0.04712535, 0.04712535, 0.04901037, 0.04901037,\n",
      "       0.04995287, 0.04995287, 0.05183789, 0.05183789, 0.05466541,\n",
      "       0.05466541, 0.05749293, 0.05749293, 0.06314797, 0.06314797,\n",
      "       0.06409048, 0.06409048, 0.06503299, 0.06503299, 0.066918  ,\n",
      "       0.066918  , 0.06786051, 0.06786051, 0.07068803, 0.07068803,\n",
      "       0.07163054, 0.07163054, 0.07257304, 0.07257304, 0.07917059,\n",
      "       0.0801131 , 0.08105561, 0.08105561, 0.08294062, 0.08294062,\n",
      "       0.08388313, 0.08388313, 0.08482564, 0.08482564, 0.08576814,\n",
      "       0.08576814, 0.08765316, 0.08765316, 0.08859566, 0.08859566,\n",
      "       0.09048068, 0.09048068, 0.0933082 , 0.0933082 , 0.09519321,\n",
      "       0.09519321, 0.09990575, 0.09990575, 0.10179076, 0.10179076,\n",
      "       0.10273327, 0.10273327, 0.10461828, 0.10461828, 0.10744581,\n",
      "       0.10744581, 0.10838831, 0.10838831, 0.11215834, 0.11215834,\n",
      "       0.11310085, 0.11310085, 0.11498586, 0.11498586, 0.11592837,\n",
      "       0.11592837, 0.11875589, 0.11875589, 0.12535344, 0.12535344,\n",
      "       0.12723845, 0.12723845, 0.13195099, 0.13195099, 0.13477851,\n",
      "       0.13477851, 0.13854854, 0.13854854, 0.13949105, 0.13949105,\n",
      "       0.14043355, 0.14043355, 0.14137606, 0.14137606, 0.14326107,\n",
      "       0.14326107, 0.1470311 , 0.1470311 , 0.14985862, 0.14985862,\n",
      "       0.15551367, 0.15551367, 0.15645617, 0.15645617, 0.1602262 ,\n",
      "       0.1602262 , 0.16682375, 0.16682375, 0.16965127, 0.16965127,\n",
      "       0.17059378, 0.17059378, 0.17530631, 0.17530631, 0.17719133,\n",
      "       0.17719133, 0.17907634, 0.17907634, 0.18190386, 0.18190386,\n",
      "       0.18567389, 0.18567389, 0.19132893, 0.19132893, 0.19509896,\n",
      "       0.19509896, 0.19698398, 0.19698398, 0.19886899, 0.19886899,\n",
      "       0.1998115 , 0.1998115 , 0.20358153, 0.20358153, 0.21771913,\n",
      "       0.21771913, 0.22148916, 0.22148916, 0.22525919, 0.22525919,\n",
      "       0.2271442 , 0.2271442 , 0.23468426, 0.23468426, 0.23751178,\n",
      "       0.23751178, 0.23845429, 0.23845429, 0.24222432, 0.24222432,\n",
      "       0.24316682, 0.24316682, 0.24787936, 0.24787936, 0.25070688,\n",
      "       0.25070688, 0.2535344 , 0.25447691, 0.25541942, 0.25541942,\n",
      "       0.26013195, 0.26013195, 0.27144204, 0.27144204, 0.28086711,\n",
      "       0.28086711, 0.29594722, 0.29594722, 0.29783223, 0.29783223,\n",
      "       0.30160226, 0.30160226, 0.30442978, 0.30442978, 0.30537229,\n",
      "       0.30537229, 0.30819981, 0.30819981, 0.31196984, 0.31196984,\n",
      "       0.31385485, 0.31385485, 0.32327992, 0.32327992, 0.32610745,\n",
      "       0.32610745, 0.34495759, 0.34495759, 0.34590009, 0.34590009,\n",
      "       0.34778511, 0.34778511, 0.35721018, 0.35721018, 0.36192271,\n",
      "       0.36192271, 0.36286522, 0.36286522, 0.36663525, 0.36663525,\n",
      "       0.37888784, 0.37888784, 0.3864279 , 0.3864279 , 0.39114043,\n",
      "       0.39114043, 0.39208294, 0.39208294, 0.40433553, 0.40433553,\n",
      "       0.40622055, 0.40622055, 0.4128181 , 0.4128181 , 0.42035815,\n",
      "       0.42035815, 0.42884072, 0.42884072, 0.42978322, 0.42978322,\n",
      "       0.43638077, 0.43638077, 0.43920829, 0.43920829, 0.44203582,\n",
      "       0.44203582, 0.45051838, 0.45051838, 0.45240339, 0.45240339,\n",
      "       0.46842601, 0.46842601, 0.47502356, 0.47502356, 0.49104618,\n",
      "       0.49104618, 0.4929312 , 0.4929312 , 0.49670123, 0.49670123,\n",
      "       0.50329877, 0.50329877, 0.50424128, 0.50424128, 0.5070688 ,\n",
      "       0.5070688 , 0.50989632, 0.50989632, 0.51366635, 0.51366635,\n",
      "       0.52309142, 0.52309142, 0.52497644, 0.52497644, 0.52874647,\n",
      "       0.52874647, 0.53817154, 0.53817154, 0.54194156, 0.54194156,\n",
      "       0.55890669, 0.55890669, 0.56361923, 0.56361923, 0.56550424,\n",
      "       0.56550424, 0.56927427, 0.56927427, 0.57115928, 0.57115928,\n",
      "       0.5730443 , 0.5730443 , 0.58058435, 0.58058435, 0.58152686,\n",
      "       0.58152686, 0.60131951, 0.60131951, 0.61828464, 0.61828464,\n",
      "       0.63242224, 0.63242224, 0.63901979, 0.63901979, 0.65786993,\n",
      "       0.65786993, 0.68426013, 0.68426013, 0.69180019, 0.69180019,\n",
      "       0.70499529, 0.70499529, 0.70593779, 0.70593779, 0.79170594,\n",
      "       0.79170594, 0.79924599, 0.79924599, 0.81715363, 0.81715363,\n",
      "       0.82092366, 0.82092366, 0.8397738 , 0.8397738 , 0.88407163,\n",
      "       0.88407163, 0.88784166, 0.88784166, 0.91894439, 0.91894439,\n",
      "       0.93213949, 0.93213949, 1.        ]), array([0.        , 0.00287356, 0.03448276, 0.03448276, 0.04022989,\n",
      "       0.04022989, 0.04597701, 0.04597701, 0.06609195, 0.06609195,\n",
      "       0.07758621, 0.07758621, 0.08908046, 0.08908046, 0.09195402,\n",
      "       0.09195402, 0.11206897, 0.11206897, 0.12643678, 0.12643678,\n",
      "       0.13505747, 0.13505747, 0.15804598, 0.15804598, 0.17241379,\n",
      "       0.17241379, 0.17816092, 0.17816092, 0.18390805, 0.18390805,\n",
      "       0.18678161, 0.18678161, 0.20689655, 0.20689655, 0.21264368,\n",
      "       0.21264368, 0.2183908 , 0.2183908 , 0.22701149, 0.22701149,\n",
      "       0.23275862, 0.23275862, 0.23850575, 0.23850575, 0.24425287,\n",
      "       0.24425287, 0.27586207, 0.27586207, 0.2816092 , 0.2816092 ,\n",
      "       0.29022989, 0.29022989, 0.29310345, 0.29310345, 0.29885057,\n",
      "       0.29885057, 0.30747126, 0.30747126, 0.31034483, 0.31034483,\n",
      "       0.31321839, 0.31321839, 0.31609195, 0.31609195, 0.32471264,\n",
      "       0.32471264, 0.32758621, 0.32758621, 0.33045977, 0.33045977,\n",
      "       0.33333333, 0.33333333, 0.33908046, 0.33908046, 0.34195402,\n",
      "       0.34195402, 0.34482759, 0.34482759, 0.35057471, 0.35057471,\n",
      "       0.3591954 , 0.3591954 , 0.36206897, 0.36206897, 0.37643678,\n",
      "       0.37643678, 0.37931034, 0.37931034, 0.38505747, 0.38505747,\n",
      "       0.38793103, 0.38793103, 0.3908046 , 0.3908046 , 0.39942529,\n",
      "       0.39942529, 0.40517241, 0.40517241, 0.40804598, 0.40804598,\n",
      "       0.41091954, 0.41091954, 0.41954023, 0.41954023, 0.42528736,\n",
      "       0.42528736, 0.42816092, 0.42816092, 0.43390805, 0.43390805,\n",
      "       0.44252874, 0.44252874, 0.45114943, 0.45114943, 0.45402299,\n",
      "       0.45402299, 0.46551724, 0.46551724, 0.4683908 , 0.4683908 ,\n",
      "       0.47413793, 0.47413793, 0.47701149, 0.47701149, 0.47988506,\n",
      "       0.47988506, 0.48563218, 0.48563218, 0.48850575, 0.48850575,\n",
      "       0.49137931, 0.49137931, 0.50862069, 0.50862069, 0.51436782,\n",
      "       0.51436782, 0.51724138, 0.51724138, 0.52298851, 0.52298851,\n",
      "       0.52586207, 0.52586207, 0.52873563, 0.52873563, 0.53448276,\n",
      "       0.53448276, 0.54597701, 0.54597701, 0.54885057, 0.54885057,\n",
      "       0.5545977 , 0.5545977 , 0.56321839, 0.56321839, 0.56896552,\n",
      "       0.56896552, 0.57471264, 0.57471264, 0.57758621, 0.57758621,\n",
      "       0.58045977, 0.58045977, 0.58333333, 0.58333333, 0.5862069 ,\n",
      "       0.5862069 , 0.59195402, 0.59195402, 0.59770115, 0.59770115,\n",
      "       0.60057471, 0.60057471, 0.60632184, 0.60632184, 0.6091954 ,\n",
      "       0.6091954 , 0.61206897, 0.61206897, 0.61494253, 0.61494253,\n",
      "       0.61781609, 0.61781609, 0.62643678, 0.62643678, 0.62931034,\n",
      "       0.62931034, 0.63505747, 0.63505747, 0.64655172, 0.64655172,\n",
      "       0.64942529, 0.64942529, 0.65517241, 0.65517241, 0.65804598,\n",
      "       0.65804598, 0.66666667, 0.66666667, 0.67528736, 0.67528736,\n",
      "       0.67816092, 0.67816092, 0.68678161, 0.68678161, 0.69252874,\n",
      "       0.69252874, 0.69827586, 0.69827586, 0.70114943, 0.70114943,\n",
      "       0.70689655, 0.70689655, 0.70977011, 0.70977011, 0.71264368,\n",
      "       0.71264368, 0.71551724, 0.71551724, 0.72126437, 0.72126437,\n",
      "       0.72413793, 0.72413793, 0.72701149, 0.72701149, 0.72988506,\n",
      "       0.72988506, 0.73275862, 0.73275862, 0.73563218, 0.73563218,\n",
      "       0.74137931, 0.74137931, 0.74425287, 0.74425287, 0.74712644,\n",
      "       0.74712644, 0.75      , 0.75      , 0.75574713, 0.75574713,\n",
      "       0.75862069, 0.75862069, 0.76436782, 0.76436782, 0.77011494,\n",
      "       0.77011494, 0.77298851, 0.77298851, 0.77586207, 0.77586207,\n",
      "       0.7816092 , 0.7816092 , 0.78448276, 0.78448276, 0.79310345,\n",
      "       0.79310345, 0.79597701, 0.79597701, 0.79885057, 0.79885057,\n",
      "       0.8045977 , 0.8045977 , 0.80747126, 0.80747126, 0.81896552,\n",
      "       0.81896552, 0.82183908, 0.82183908, 0.83045977, 0.83045977,\n",
      "       0.83333333, 0.83333333, 0.8362069 , 0.8362069 , 0.83908046,\n",
      "       0.83908046, 0.84195402, 0.84195402, 0.84482759, 0.84482759,\n",
      "       0.84770115, 0.84770115, 0.85057471, 0.85057471, 0.85344828,\n",
      "       0.85344828, 0.85632184, 0.85632184, 0.8591954 , 0.8591954 ,\n",
      "       0.86206897, 0.86206897, 0.86781609, 0.86781609, 0.87068966,\n",
      "       0.87068966, 0.87356322, 0.87356322, 0.88218391, 0.88218391,\n",
      "       0.88505747, 0.88505747, 0.88793103, 0.88793103, 0.8908046 ,\n",
      "       0.8908046 , 0.89367816, 0.89367816, 0.89655172, 0.89655172,\n",
      "       0.89942529, 0.89942529, 0.90229885, 0.90229885, 0.90517241,\n",
      "       0.90517241, 0.90804598, 0.90804598, 0.91091954, 0.91091954,\n",
      "       0.9137931 , 0.9137931 , 0.91954023, 0.91954023, 0.92241379,\n",
      "       0.92241379, 0.92528736, 0.92528736, 0.93103448, 0.93103448,\n",
      "       0.93390805, 0.93390805, 0.93678161, 0.93678161, 0.93965517,\n",
      "       0.93965517, 0.94252874, 0.94252874, 0.9454023 , 0.9454023 ,\n",
      "       0.94827586, 0.94827586, 0.95114943, 0.95114943, 0.95402299,\n",
      "       0.95402299, 0.95689655, 0.95689655, 0.95977011, 0.95977011,\n",
      "       0.96264368, 0.96264368, 0.96551724, 0.96551724, 0.9683908 ,\n",
      "       0.9683908 , 0.97126437, 0.97126437, 0.97413793, 0.97413793,\n",
      "       0.97701149, 0.97701149, 0.97988506, 0.97988506, 0.98275862,\n",
      "       0.98275862, 0.98563218, 0.98563218, 0.98850575, 0.98850575,\n",
      "       0.99137931, 0.99137931, 0.99425287, 0.99425287, 0.99712644,\n",
      "       0.99712644, 1.        , 1.        ]), array([       inf, 0.93036861, 0.86734206, 0.86418723, 0.85730309,\n",
      "       0.85649378, 0.84568164, 0.84543596, 0.82483126, 0.8201441 ,\n",
      "       0.81311169, 0.81164465, 0.79891705, 0.79828598, 0.79744205,\n",
      "       0.79673396, 0.79148484, 0.79018084, 0.78410715, 0.78325301,\n",
      "       0.78068026, 0.77975555, 0.77314361, 0.77149969, 0.76317728,\n",
      "       0.75771678, 0.75530964, 0.7467536 , 0.74633576, 0.74593898,\n",
      "       0.73787043, 0.73150142, 0.7155645 , 0.7132533 , 0.71147411,\n",
      "       0.71006504, 0.705358  , 0.70391142, 0.69934458, 0.6989776 ,\n",
      "       0.69636937, 0.69577815, 0.69040906, 0.68975946, 0.68396617,\n",
      "       0.68341116, 0.65824648, 0.65645995, 0.6543799 , 0.64886034,\n",
      "       0.64615326, 0.64511389, 0.64509061, 0.63984949, 0.63899737,\n",
      "       0.63606738, 0.63405227, 0.63368792, 0.63038056, 0.62929326,\n",
      "       0.62715999, 0.6256313 , 0.62344177, 0.61735308, 0.61333738,\n",
      "       0.60597822, 0.60516151, 0.60438333, 0.60412377, 0.59867567,\n",
      "       0.598105  , 0.59240035, 0.59157241, 0.58974186, 0.58832281,\n",
      "       0.58633914, 0.58335363, 0.57618962, 0.57279834, 0.56287395,\n",
      "       0.56209214, 0.55871588, 0.55851295, 0.55585014, 0.5524567 ,\n",
      "       0.5519966 , 0.55173012, 0.54869136, 0.54496052, 0.54303347,\n",
      "       0.5412379 , 0.54077989, 0.54068863, 0.53644826, 0.53378715,\n",
      "       0.53207846, 0.53126791, 0.5289874 , 0.52850005, 0.52609366,\n",
      "       0.52319534, 0.52295562, 0.51740022, 0.51454525, 0.5128666 ,\n",
      "       0.51240449, 0.51220439, 0.51129218, 0.50843466, 0.50739239,\n",
      "       0.50511755, 0.50351112, 0.49924286, 0.49774549, 0.49676048,\n",
      "       0.48983178, 0.48542537, 0.48237841, 0.48127251, 0.47991475,\n",
      "       0.4792829 , 0.47653343, 0.47493432, 0.46687942, 0.46466341,\n",
      "       0.46235473, 0.45876252, 0.45762865, 0.45728654, 0.45396147,\n",
      "       0.45327582, 0.45322971, 0.44540807, 0.44035387, 0.43909475,\n",
      "       0.43851404, 0.43850714, 0.4374161 , 0.4339261 , 0.43365281,\n",
      "       0.43253698, 0.42874795, 0.42838317, 0.4201639 , 0.41965098,\n",
      "       0.41906404, 0.41688636, 0.40384019, 0.40300232, 0.40114515,\n",
      "       0.40023483, 0.39694656, 0.39469319, 0.39339126, 0.39210513,\n",
      "       0.39051892, 0.38930922, 0.38920281, 0.38850045, 0.38653204,\n",
      "       0.38567056, 0.38363389, 0.38329059, 0.38001527, 0.37970083,\n",
      "       0.37548454, 0.37365995, 0.37361821, 0.37010808, 0.36452856,\n",
      "       0.3638944 , 0.35829263, 0.35772756, 0.35688172, 0.35595225,\n",
      "       0.35580895, 0.35507775, 0.34766921, 0.34751604, 0.34609368,\n",
      "       0.3459747 , 0.34360625, 0.34251243, 0.34066434, 0.34061995,\n",
      "       0.33865711, 0.33811938, 0.33243296, 0.32872028, 0.32495288,\n",
      "       0.32317745, 0.32231913, 0.32173408, 0.32145383, 0.32043845,\n",
      "       0.31981616, 0.31849466, 0.31635419, 0.31353551, 0.30506185,\n",
      "       0.3038763 , 0.30135394, 0.30036661, 0.29785788, 0.29672634,\n",
      "       0.29611863, 0.29468651, 0.29032967, 0.28985051, 0.28895018,\n",
      "       0.28851766, 0.28846186, 0.288309  , 0.2865539 , 0.28639019,\n",
      "       0.28630836, 0.28567951, 0.28415397, 0.28391369, 0.28204003,\n",
      "       0.28181318, 0.27923773, 0.27819659, 0.27780412, 0.27769018,\n",
      "       0.2757513 , 0.27388533, 0.26977967, 0.26928634, 0.26393067,\n",
      "       0.26370485, 0.25147294, 0.25074872, 0.24987825, 0.24946767,\n",
      "       0.24641104, 0.24575234, 0.24385571, 0.24260233, 0.24246899,\n",
      "       0.24191922, 0.23916651, 0.23650475, 0.23511477, 0.23304303,\n",
      "       0.23200776, 0.23175645, 0.22536036, 0.2249086 , 0.22402926,\n",
      "       0.2231088 , 0.21098824, 0.21093075, 0.21060639, 0.20817224,\n",
      "       0.20748694, 0.20685561, 0.2011897 , 0.19955868, 0.19821109,\n",
      "       0.19725543, 0.19692671, 0.19579434, 0.19358478, 0.19230412,\n",
      "       0.18756879, 0.18719062, 0.18341986, 0.18229825, 0.17998326,\n",
      "       0.17961746, 0.17958509, 0.17842096, 0.17468107, 0.1745642 ,\n",
      "       0.17392123, 0.17388887, 0.17093441, 0.17053651, 0.1692642 ,\n",
      "       0.16849918, 0.16624505, 0.16576882, 0.16534669, 0.16436001,\n",
      "       0.16244558, 0.16243364, 0.16174278, 0.16097982, 0.16037339,\n",
      "       0.16030797, 0.15847015, 0.15837338, 0.15814698, 0.15792851,\n",
      "       0.15344008, 0.15271964, 0.15197113, 0.15181629, 0.14787347,\n",
      "       0.14764305, 0.14717758, 0.14688051, 0.14592689, 0.1458334 ,\n",
      "       0.14457912, 0.1442514 , 0.1435661 , 0.14292077, 0.14234737,\n",
      "       0.1415144 , 0.13990107, 0.13965014, 0.13857806, 0.13823609,\n",
      "       0.13514532, 0.13506902, 0.13446298, 0.13433325, 0.13401364,\n",
      "       0.13349698, 0.12990337, 0.12984922, 0.12915526, 0.1290376 ,\n",
      "       0.1252095 , 0.12518542, 0.12447726, 0.12412921, 0.12334499,\n",
      "       0.12331518, 0.12213864, 0.1215982 , 0.12155747, 0.12122695,\n",
      "       0.12074162, 0.1206066 , 0.11868242, 0.11864146, 0.11862816,\n",
      "       0.11852828, 0.1120964 , 0.11146059, 0.10776697, 0.10720229,\n",
      "       0.10381543, 0.10340206, 0.1019967 , 0.10191254, 0.09851539,\n",
      "       0.09835161, 0.09051088, 0.09034801, 0.08813827, 0.0880036 ,\n",
      "       0.08520469, 0.08516473, 0.08506201, 0.08502719, 0.06815525,\n",
      "       0.06773585, 0.06617344, 0.06471183, 0.06018365, 0.05991696,\n",
      "       0.05892893, 0.05884379, 0.05352678, 0.05333942, 0.04322809,\n",
      "       0.04278959, 0.04171203, 0.04167299, 0.03494049, 0.03486069,\n",
      "       0.03208817, 0.03201568, 0.023578  ]))\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # 感兴趣的读者可以查看下roc_curve()函数返回的内容\n",
    "print(roc_curve(y_test, y_pred_proba[:,1]))\n",
    "type(roc_curve(y_test, y_pred_proba[:,1]))\n",
    "len(roc_curve(y_test, y_pred_proba[:,1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inf</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.930369</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.002874</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.867342</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.864187</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.857303</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.040230</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         阈值      假警报率       命中率\n",
       "0       inf  0.000000  0.000000\n",
       "1  0.930369  0.000000  0.002874\n",
       "2  0.867342  0.000000  0.034483\n",
       "3  0.864187  0.001885  0.034483\n",
       "4  0.857303  0.001885  0.040230"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 2.查看假警报率（fpr）、命中率（tpr）及阈值（thres）\n",
    "a = pd.DataFrame()  # 创建一个空DataFrame \n",
    "a['阈值'] = list(thres)\n",
    "a['假警报率'] = list(fpr)\n",
    "a['命中率'] = list(tpr)\n",
    "a.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "      <th>TPR-FPR</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inf</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.930369</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.002874</td>\n",
       "      <td>0.002874</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.867342</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.034483</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.864187</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.034483</td>\n",
       "      <td>0.032598</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.857303</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.040230</td>\n",
       "      <td>0.038345</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>373</th>\n",
       "      <td>0.034940</td>\n",
       "      <td>0.918944</td>\n",
       "      <td>0.994253</td>\n",
       "      <td>0.075308</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>374</th>\n",
       "      <td>0.034861</td>\n",
       "      <td>0.918944</td>\n",
       "      <td>0.997126</td>\n",
       "      <td>0.078182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>375</th>\n",
       "      <td>0.032088</td>\n",
       "      <td>0.932139</td>\n",
       "      <td>0.997126</td>\n",
       "      <td>0.064987</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>376</th>\n",
       "      <td>0.032016</td>\n",
       "      <td>0.932139</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.067861</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>377</th>\n",
       "      <td>0.023578</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>378 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           阈值      假警报率       命中率   TPR-FPR\n",
       "0         inf  0.000000  0.000000  0.000000\n",
       "1    0.930369  0.000000  0.002874  0.002874\n",
       "2    0.867342  0.000000  0.034483  0.034483\n",
       "3    0.864187  0.001885  0.034483  0.032598\n",
       "4    0.857303  0.001885  0.040230  0.038345\n",
       "..        ...       ...       ...       ...\n",
       "373  0.034940  0.918944  0.994253  0.075308\n",
       "374  0.034861  0.918944  0.997126  0.078182\n",
       "375  0.032088  0.932139  0.997126  0.064987\n",
       "376  0.032016  0.932139  1.000000  0.067861\n",
       "377  0.023578  1.000000  1.000000  0.000000\n",
       "\n",
       "[378 rows x 4 columns]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAHCCAYAAAD4qFOaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9+klEQVR4nO3deXhU9aH/8c8kk0wWspIQIAQIBBGVgGAQUKAggj82KS4V9dr2at0qgkuqtKC3tQp1QVpvS+WKIIio1brUHQWCCC4RCcSwCBIIYQsxzASSTJY5vz+QgQgJScjMmeX9ep48zzlnzjfz4ajMxzPnnK/FMAxDAAAAfizE7AAAAABni0IDAAD8HoUGAAD4PQoNAADwexQaAADg9yg0AADA71FoAACA36PQAAAAv0ehAQAAfo9CAyAg7N+/Xx9//LGcTqckad++fXrttddkt9tNTgbAGyg0AAJCTk6OLr/8ch09elSStHHjRl1zzTXav39/o+MMw9Cll16qhQsX1tv+4osv6vzzz9eWLVtUWVmpkpISj2UHcPYoNABa3apVq2SxWNw/SUlJuvLKK7Vlyxb3Pu+++64yMzMVERGh8847T2+88cYpv+eJJ55QWlqaoqKiNGnSJB04cKDB94yKipIkxcfHS5Kio6MlSTabrdGsH330kb766itdeOGF9ba3adNGBQUF6tChg6ZPn16vLAHwPRQaAB6zcOFCffHFF/r73/+ubdu2aciQISorK9MXX3yhiRMnqkuXLnrrrbfUq1cvXXPNNVq3bp177OzZs/X73/9e99xzj958800VFRXpF7/4RYPvZbFYJEkhIc37a+1Pf/qTZsyYob59+6q8vNy9/XgxioqK0qOPPqq0tDR9//33zfrdALzIAIBWtnLlSkOSsW7dOve2jRs3GpKMF154wZg0aZKRkpJiVFVVGYZhGE6n00hJSTEmTZpkGIZh2O12Izo62rj77rvd47/88ktDkrF27VrDMAxjyZIlhiQjPDzcsNlsRlhYmCHJsNlshs1mM8LDw+u9fnz9lVdecf/OxYsXGz169DCqqqqMTz/91IiNjTU+++yzen+GgwcPGmvXrjWeeeYZ48orrzR+//vfe/z4AWg+ztAA8IrevXvLZrNpz549ysnJ0ZAhQ9xfB4WHh2vo0KHKycmRJC1fvlxHjx7V1Vdf7R7fr18/hYSEKD8/X5IUEREhSdq6dauqqqr073//W5JUVVWlqqoqffLJJ/Ve//bbbyWd+ApqzZo1mjJliubNm6eamhr96U9/0qBBg3TkyBE9+uijevTRRyVJnTt31pQpU7RhwwYNHjxYV1xxhacPFYAWsJodAEBwKCsrk9PpVHR0tEpLS9W5c+d6r3fq1EmlpaUqLy/Xpk2bJEk9e/Z0vx4aGqoPP/xQ3bp1c6+3xPFxH3zwgex2u0aOHCmbzabw8HAVFBTomWeeUVFRkYYOHaqPP/5YGzduVI8ePdzjKyoqVF5erpiYmBa9PwDP4AwNAI8rKSnRlClTFB4erokTJ0o6cdHuccfXy8vLdfDgQUlSYmJivX1GjhzpLjTHr5lpqSlTpujLL79UZWWlhgwZoj//+c/q1KmT/vKXv+ill17SPffcI0n65ptv9K9//UszZ87Uz372MyUkJLjPBgHwHZyhAeAxgwYNci8nJyfrpZdektV67K8dwzDq7Xt83WKxuJ8l05QLfHv27CmLxSKXyyXpxFdRx3/f8dd/+n4pKSlKSUnRCy+8oMOHD+uuu+6SJL322mv6z3/+4z5LdOutt6pv377KzMzUjTfeqCeeeEK9e/du3oEA4HGcoQHgMYsXL9b69euVlpamyy+/XFdddZXi4uIk6ZRboI+vx8bGqk2bNqfdZ9SoUVqyZEm9bc29huZkH330kaZOnap58+appKREmzdvVm1trXr16qXZs2dr3LhxuvXWW7Vq1Sr95je/0UsvvaS2bdu6SxMA38EZGgAe06NHD1144YV64IEHNHXqVP3xj39URkaG2rVrp127dtXbt6ioSO3atVN0dLT7mpXvv/9effr0kSRVV1fr448/1s9//vNWyeZwODR+/HjV1NRowIABslqtGjx4sFatWuXe59tvv9XLL7+sXbt2aeLEiYqNjdWRI0da5f0BtC7O0ADwuFtuuUXt27fXrFmzJEnDhw/Xp59+qqqqKkmS0+nUp59+quHDh0uSRo8eLUl6++233b9j7dq1MgxD/fv3b5VMsbGxWrp0qT777DPt27dPTqezXpmRpIkTJ+qrr75SVlaWUlNTtXr1amVmZrbK+wNoXRQaAB5ns9n0u9/9TkuWLNHu3buVnZ2tw4cP6+qrr9aHH36oyZMn64cfftB9990n6diZnVtuuUWPPPKI5s6dq3feeUe33HKLBg0apAEDBkg69Rqclrj66qvVvXt3bdu2TX/96181efJkLV682P36+vXrZbVadfToUb399tuKiYmp9/A9AL6DQgPAK2699VYlJSXpL3/5i/r376+3335bu3fv1oQJE7Rlyxa99tprysrKcu8/b948ZWdna/bs2br22mvVr1+/emdsamtrJR276DciIkKTJk2SdOyi4IiICF122WX1Xj///PMlyX3x8Hvvvac2bdooJSVF1157rdatW6cBAwZoyJAhOnjwoG655RbdcMMNmjlzpqKiovSHP/zB/ee45ZZbPH/AADSLxWiN/80BAC978cUX9V//9V/auXOnunbtesb9t2/frh49euiVV17Rtddeq7q6Oj3++OMaNWqU+vXrJ4vFopqaGk2bNk2LFi1SWlqaXnzxRV100UVas2aNRo8ere7du2vz5s166qmndPfdd3v+DwmgySg0AHCSZ599Vna7XVOnTq03seX69et1zz33qGvXrnr++edb/GA/AJ5BoQEAAH6Pa2gAAIDfo9AAAAC/R6EBAAB+LyieFOxyubR3717FxMSc9YR2AADAOwzDUHl5uTp27HjGud2CotDs3btXaWlpZscAAAAtUFRUpE6dOjW6T1AUmpiYGEnHDkhsbKzJaQAAQFM4HA6lpaW5P8cbExSF5vjXTLGxsRQaAAD8TFMuF+GiYAAA4PcoNAAAwO9RaAAAgN+j0AAAAL9HoQEAAH6PQgMAAPwehQYAAPg9Cg0AAPB7FBoAAOD3KDQAAMDvmVZoSktLlZ6ersLCwibtn5OTo169eikpKUlz5szxbDgAAOBXTCk0hw4d0rhx45pcZkpKSjRhwgRNnjxZ69at09KlS7Vy5UrPhgQAAH7DlMkpr7vuOl133XX6/PPPm7T/0qVL1aFDB82cOVMWi0UPPfSQFixYoOHDh3s4KQAA/qGmzqUDjirT3j8yLFRt29hMe39TCs38+fPVrVs3TZs2rUn75+XlacSIEe7ZNgcMGKDp06c3uL/T6ZTT6XSvOxyOs8oLAICvqK51qaisot42wzA07pk1qqpxmZRKmtCno/42+ULT3t+UQtOtW7dm7e9wOHTeeee512NjY1VcXNzg/rNmzdIf//jHFucDAMDTKqvr9P2hI80ed+X/fqZal9HoPjar968osYZavP6e9d7f1HdvIqvVKpvtxGmsiIgIVVRUNLj/9OnTde+9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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 3.绘制ROC曲线\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文\n",
    "plt.plot(fpr, tpr)  # 通过plot()函数绘制折线图\n",
    "plt.title('ROC曲线')  # 添加标题，注意如果要写中文，需要在之前添加一行代码：plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.xlabel('FPR')  # 添加X轴标签\n",
    "plt.ylabel('TPR')  # 添加Y轴标\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8103854528908967"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 4.求出模型的AUC值\n",
    "from sklearn.metrics import roc_auc_score\n",
    "score = roc_auc_score(y_test, y_pred_proba[:,1])\n",
    "score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**补充知识点：对阈值取值的理解**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9303686064523984"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max(y_pred_proba[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>分类为0概率</th>\n",
       "      <th>分类为1概率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>326</th>\n",
       "      <td>0.069631</td>\n",
       "      <td>0.930369</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>366</th>\n",
       "      <td>0.085373</td>\n",
       "      <td>0.914627</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>662</th>\n",
       "      <td>0.092923</td>\n",
       "      <td>0.907077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1154</th>\n",
       "      <td>0.105118</td>\n",
       "      <td>0.894882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1036</th>\n",
       "      <td>0.105906</td>\n",
       "      <td>0.894094</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1093</th>\n",
       "      <td>0.111303</td>\n",
       "      <td>0.888697</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1164</th>\n",
       "      <td>0.115550</td>\n",
       "      <td>0.884450</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>891</th>\n",
       "      <td>0.116594</td>\n",
       "      <td>0.883406</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>437</th>\n",
       "      <td>0.123060</td>\n",
       "      <td>0.876940</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1153</th>\n",
       "      <td>0.127293</td>\n",
       "      <td>0.872707</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>749</th>\n",
       "      <td>0.129633</td>\n",
       "      <td>0.870367</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>0.132658</td>\n",
       "      <td>0.867342</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>681</th>\n",
       "      <td>0.133410</td>\n",
       "      <td>0.866590</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1327</th>\n",
       "      <td>0.135813</td>\n",
       "      <td>0.864187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>264</th>\n",
       "      <td>0.136599</td>\n",
       "      <td>0.863401</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        分类为0概率    分类为1概率\n",
       "326   0.069631  0.930369\n",
       "366   0.085373  0.914627\n",
       "662   0.092923  0.907077\n",
       "1154  0.105118  0.894882\n",
       "1036  0.105906  0.894094\n",
       "1093  0.111303  0.888697\n",
       "1164  0.115550  0.884450\n",
       "891   0.116594  0.883406\n",
       "437   0.123060  0.876940\n",
       "1153  0.127293  0.872707\n",
       "749   0.129633  0.870367\n",
       "49    0.132658  0.867342\n",
       "681   0.133410  0.866590\n",
       "1327  0.135813  0.864187\n",
       "264   0.136599  0.863401"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = pd.DataFrame(y_pred_proba, columns=['分类为0概率', '分类为1概率'])\n",
    "a = a.sort_values('分类为1概率', ascending=False)\n",
    "a.head(15)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 补充知识点：KS曲线绘制"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "fpr, tpr, thres = roc_curve(y_test, y_pred_proba[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inf</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.930369</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.002874</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.867342</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.864187</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.857303</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.040230</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         阈值      假警报率       命中率\n",
       "0       inf  0.000000  0.000000\n",
       "1  0.930369  0.000000  0.002874\n",
       "2  0.867342  0.000000  0.034483\n",
       "3  0.864187  0.001885  0.034483\n",
       "4  0.857303  0.001885  0.040230"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = pd.DataFrame()  # 创建一个空DataFrame \n",
    "a['阈值'] = list(thres)\n",
    "a['假警报率'] = list(fpr)\n",
    "a['命中率'] = list(tpr)\n",
    "a.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(thres[1:], tpr[1:])\n",
    "plt.plot(thres[1:], fpr[1:])\n",
    "plt.plot(thres[1:], tpr[1:] - fpr[1:])\n",
    "plt.xlabel('threshold')\n",
    "plt.legend(['tpr', 'fpr', 'tpr-fpr'])\n",
    "plt.gca().invert_xaxis() \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4744656418256471"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max(tpr - fpr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "      <th>TPR-FPR</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inf</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.930369</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.002874</td>\n",
       "      <td>0.002874</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.867342</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.034483</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.864187</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.034483</td>\n",
       "      <td>0.032598</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.857303</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.040230</td>\n",
       "      <td>0.038345</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         阈值      假警报率       命中率   TPR-FPR\n",
       "0       inf  0.000000  0.000000  0.000000\n",
       "1  0.930369  0.000000  0.002874  0.002874\n",
       "2  0.867342  0.000000  0.034483  0.034483\n",
       "3  0.864187  0.001885  0.034483  0.032598\n",
       "4  0.857303  0.001885  0.040230  0.038345"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# KS值对应的阈值\n",
    "a['TPR-FPR'] = a['命中率'] - a['假警报率']\n",
    "a.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4744656418256471"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 另外一种获取KS值的方式\n",
    "max(a['TPR-FPR'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "      <th>TPR-FPR</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>224</th>\n",
       "      <td>0.27769</td>\n",
       "      <td>0.255419</td>\n",
       "      <td>0.729885</td>\n",
       "      <td>0.474466</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          阈值      假警报率       命中率   TPR-FPR\n",
       "224  0.27769  0.255419  0.729885  0.474466"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 获取KS值对应的阈值等信息\n",
    "a[a['TPR-FPR'] == max(a['TPR-FPR'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
